package main

import (
	"fmt"
	"net"
	"strings"
)

// 用户对象
type User struct {
	Name string
	Addr string
	C    chan string
	conn net.Conn

	// 用户当前连接到的服务端
	server *Server
}

// 创建一个用户对象
func NewUser(conn net.Conn, server *Server) *User {
	name := conn.RemoteAddr().String()
	user := &User{
		Name:   name,
		Addr:   name,
		C:      make(chan string),
		conn:   conn,
		server: server,
	}

	// 监听用户chan中的消息
	go user.ListenMessage()
	return user
}

// 用户上线业务
func (this *User) Online() {
	// 用户上线，将用户加入到OnlineMap中
	this.server.mapLock.Lock()
	this.server.OnlineMap[this.Name] = this
	this.server.mapLock.Unlock()

	// 广播用户上线消息
	this.server.BroadCast(this, "已上线")
}

// 用户下线业务
func (this *User) Offline() {
	// 用户上线，将用户从OnlineMap中删除
	this.server.mapLock.Lock()
	delete(this.server.OnlineMap, this.Name)
	this.server.mapLock.Unlock()

	// 广播用户上线消息
	this.server.BroadCast(this, "已下线")
}

// 给当前user对应的客户端发送消息
func (this *User) sendMsg(msg string) {
	this.conn.Write([]byte(msg))

}

// 处理消息业务
func (this *User) DoMessage(msg string) {
	// 如果用户输入who指令,返回当前的在线的用户信息
	if msg == "who" {
		for _, user := range this.server.OnlineMap {
			msg := "[" + user.Addr + "]" + user.Name + ": " + "在线...\n"
			this.sendMsg(msg)
		}
	} else if(len(msg) > 7 && "rename|" == msg[:7]) {
		// 消息格式rename|张三
		newName := strings.Split(msg, "|")[1]
		_, ok := this.server.OnlineMap[newName]
		if ok {
			this.sendMsg("当前用户名已经被使用\n")
		}
		// 更新server中的用户名
		this.server.mapLock.Lock()
		delete(this.server.OnlineMap, this.Name)
		this.server.OnlineMap[newName] = this
		this.server.mapLock.Unlock()

		this.Name = newName
		this.sendMsg("您已经更新用户名" + this.Name + "\n")

	} else {
		this.server.BroadCast(this, msg)
	}
}

// 当用户chan中有消息时,立刻发送到客户端
func (this *User) ListenMessage() {
	for {
		msg := <-this.C
		_, err := this.conn.Write([]byte(msg + "\n"))
		if err != nil {
			fmt.Println("conn write err: ", err)
		}
	}

}
